#--
# Proyecto Único (Etapa 2)
# Analizador Sintáctico
# 
# Autores:
# (Grupo R07)
# César Hernández (06-39724)
# Daniel Valera (07-41725)
# 
# Versión: 0.1
#++
# = Token.rb
# Archivo que contiene la clase Token y las siguientes subclases de ella:
# 
# Tokens denotados por valores: TkId, TkNum, TkString y TkBooleano.
# 
# Tokens denotados por signos: TkDot, TkComma, TkColon, TkSemiColon, 
# TkLParenths, TkRParenths, TkLBrackets, TkRBrackets, TkLBraces, TkRBraces, 
# TkPlus, TkMinus, TkAsterisk, TkSlash, TkPercent, TkDoubleAst, TkLessThan, 
# TkGreaterThan, TkLessEqual, TkGreaterEqual, TkEqual, TkNotEqual, TkDollar, 
# TkAt, TkCaret, TkDoubleAmp, TkDoublePipe, TkBang y TkAssign.
#
# Tokens denotados por palabras: TkWNum, TkWVec, TkWMat, TkWVars, TkWZeroes, 
# TkWRange, TkWEye, TkWDefine, TkWOf, TkWType, TkWAs, TkWReturn, TkWBegin, 
# TkWEnd, TkWIf, TkWThen, TkWElse, TkWWhile, TkWDo, TkWForEach, TkWIn, TkWRead 
# y TkWWrite.

# = class Token
# Clase compuesta por:
# <b>line</b>:: Línea en la que se encuentra el token.
# <b>column</b>:: Columna en la que se encuentra el token.
# <b>name</b>:: Nombre del token.
# <b>value</b>:: Valor correspondiente al token.
class Token
  attr_reader :line, :column, :name, :value

  # Inicializador de la clase.
  # <i>line</i>:: Línea en la que se encuentra el token.
  # <i>column</i>:: Columna en la que se encuentra el token.
  def initialize(line, column)
    @line   = line
    @column = column
    @name   = "Token"
    @value  = ""
  end

  # Método que devuelve una representación en cadena de caracteres de la clase.
  def to_s
    if @value.to_s.empty?
    "#{@name} (Línea #{@line}, Columna #{@column})"
    else
    "#{@name} #{@value} (Línea #{@line}, Columna #{@column})"
    end
  end
end

#--
# Tokens denotados por valores.
#++

# Token identificador.
class TkId < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el identificador.
  # <i>column</i>:: Columna en la que se encuentra el identificador.
  # <i>value</i>:: El identificador encontrado.
  def initialize(line, column, value)
    super(line, column)
    @name  = "TkId"
    @value = value
  end
end

# Token número.
class TkNum < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el número.
  # <i>column</i>:: Columna en la que se encuentra el número.
  # <i>value</i>:: El número encontrado.
  def initialize(line, column, value)
    super(line, column)
    @name  = "TkNum"
    @value = value
  end
end

# Token cadena de caracteres.
class TkString < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la cadena de caracteres.
  # <i>column</i>:: Columna en la que se encuentra la cadena de caracteres.
  # <i>value</i>:: La cadena de caracteres encontrada.
  def initialize(line, column, value)
    super(line, column)
    @name  = "TkString"
    @value = value[1 ... -1]
  end
end

# Token booleano.
class TkBooleano < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el booleano.
  # <i>column</i>:: Columna en la que se encuentra el booleano.
  # <i>value</i>:: El booleano encontrado.
  def initialize(line, column, value)
    super(line, column)
    @name  = "TkBooleano"
    @value = value
  end
end

#--
# Tokens denotados por signos.
#++

# Token punto (".").
class TkDot < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el punto.
  # <i>column</i>:: Columna en la que se encuentra el punto.
  def initialize(line, column)
    super(line, column)
    @name  = "TkDot"
    @value = "."
  end
end

# Token coma (",").
class TkComma < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la coma.
  # <i>column</i>:: Columna en la que se encuentra la coma.
  def initialize(line, column)
    super(line, column)
    @name  = "TkComma"
    @value = ","
  end
end

# Token dos puntos (":").
class TkColon < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentran los dos puntos.
  # <i>column</i>:: Columna en la que se encuentran los dos puntos.
  def initialize(line, column)
    super(line, column)
    @name  = "TkColon"
    @value = ":"
  end
end

# Token punto y coma (";").
class TkSemiColon < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el punto y coma.
  # <i>column</i>:: Columna en la que se encuentra el punto y coma.
  def initialize(line, column)
    super(line, column)
    @name  = "TkSemiColon"
    @value = ";"
  end
end

# Token paréntesis izquierdo ("(").
class TkLParenths < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el paréntesis izquierdo.
  # <i>column</i>:: Columna en la que se encuentra el paréntesis izquierdo.
  def initialize(line, column)
    super(line, column)
    @name  = "TkLParenths"
    @value = "("
  end
end

# Token paréntesis derecho (")").
class TkRParenths < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el paréntesis derecho.
  # <i>column</i>:: Columna en la que se encuentra el paréntesis derecho.
  def initialize(line, column)
    super(line, column)
    @name  = "TkRParenths"
    @value = ")"
  end
end

# Token corchete izquierdo ("[").
class TkLBrackets < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el corchete izquierdo.
  # <i>column</i>:: Columna en la que se encuentra el corchete izquierdo.
  def initialize(line, column)
    super(line, column)
    @name  = "TkLBrackets"
    @value = "["
  end
end

# Token corchete derecho ("]").
class TkRBrackets < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el corchete derecho.
  # <i>column</i>:: Columna en la que se encuentra el corchete derecho.
  def initialize(line, column)
    super(line, column)
    @name  = "TkRBrackets"
    @value = "]"
  end
end

# Token llave izquierda ("{").
class TkLBraces < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la llave izquierda.
  # <i>column</i>:: Columna en la que se encuentra la llave izquierda.
  def initialize(line, column)
    super(line, column)
    @name  = "TkLBraces"
    @value = "{"
  end
end

# Token llave derecha ("}").
class TkRBraces < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la llave derecha.
  # <i>column</i>:: Columna en la que se encuentra la llave derecha.
  def initialize(line, column)
    super(line, column)
    @name  = "TkRBraces"
    @value = "}"
  end
end

# Token signo más ("+").
class TkPlus < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo más.
  # <i>column</i>:: Columna en la que se encuentra el signo más.
  def initialize(line, column)
    super(line, column)
    @name  = "TkPlus"
    @value = "+"
  end
end

# Token signo menos ("-").
class TkMinus < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo menos.
  # <i>column</i>:: Columna en la que se encuentra el signo menos.
  def initialize(line, column)
    super(line, column)
    @name  = "TkMinus"
    @value = "-"
  end
end

# Token asterisco ("*").
class TkAsterisk < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el asterisco.
  # <i>column</i>:: Columna en la que se encuentra el asterisco.
  def initialize(line, column)
    super(line, column)
    @name  = "TkAsterisk"
    @value = "*"
  end
end

# Token barra ("/").
class TkSlash < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la barra.
  # <i>column</i>:: Columna en la que se encuentra la barra.
  def initialize(line, column)
    super(line, column)
    @name  = "TkSlash"
    @value = "/"
  end
end

# Token signo porcentaje ("%").
class TkPercent < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo porcentaje.
  # <i>column</i>:: Columna en la que se encuentra el signo porcentaje.
  def initialize(line, column)
    super(line, column)
    @name  = "TkPercent"
    @value = "%"
  end
end

# Token doble asterisco ("**").
class TkDoubleAst < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentran los asteriscos.
  # <i>column</i>:: Columna en la que se encuentran los asteriscos.
  def initialize(line, column)
    super(line, column)
    @name  = "TkDoubleAst"
    @value = "**"
  end
end

# Token signo menor que ("<").
class TkLessThan < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo menor que.
  # <i>column</i>:: Columna en la que se encuentra el signo menor que.
  def initialize(line, column)
    super(line, column)
    @name  = "TkLessThan"
    @value = "<"
  end
end

# Token signo mayor que (">").
class TkGreaterThan < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo mayor que.
  # <i>column</i>:: Columna en la que se encuentra el signo mayor que.
  def initialize(line, column)
    super(line, column)
    @name  = "TkGreaterThan"
    @value = ">"
  end
end

# Token signo menor o igual ("<=").
class TkLessEqual < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo menor o igual.
  # <i>column</i>:: Columna en la que se encuentra el signo menor o igual.
  def initialize(line, column)
    super(line, column)
    @name  = "TkLessEqual"
    @value = "<="
  end
end

# Token signo mayor o igual (">=").
class TkGreaterEqual < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo mayor o igual.
  # <i>column</i>:: Columna en la que se encuentra el signo mayor o igual.
  def initialize(line, column)
    super(line, column)
    @name  = "TkGreaterEqual"
    @value = ">="
  end
end

# Token signo igual ("=").
class TkEqual < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo igual.
  # <i>column</i>:: Columna en la que se encuentra el signo igual.
  def initialize(line, column)
    super(line, column)
    @name  = "TkEqual"
    @value = "="
  end
end

# Token signo desigual ("!=").
class TkNotEqual < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo desigual.
  # <i>column</i>:: Columna en la que se encuentra el signo desigual.
  def initialize(line, column)
    super(line, column)
    @name  = "TkNotEqual"
    @value = "!="
  end
end

# Token signo dólar ("$").
class TkDollar < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo dólar.
  # <i>column</i>:: Columna en la que se encuentra el signo dólar.
  def initialize(line, column)
    super(line, column)
    @name  = "TkDollar"
    @value = "$"
  end
end

# Token arroba ("@").
class TkAt < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el arroba.
  # <i>column</i>:: Columna en la que se encuentra el arroba.
  def initialize(line, column)
    super(line, column)
    @name  = "TkAt"
    @value = "@"
  end
end

# Token signo exponencial ("^").
class TkCaret < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo exponencial.
  # <i>column</i>:: Columna en la que se encuentra el signo exponencial.
  def initialize(line, column)
    super(line, column)
    @name  = "TkCaret"
    @value = "^"
  end
end

# Token doble et ("&&").
class TkDoubleAmp < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentran los ets.
  # <i>column</i>:: Columna en la que se encuentran los ets.
  def initialize(line, column)
    super(line, column)
    @name  = "TkDoubleAmp"
    @value = "&&"
  end
end

# Token doble barra vertical ("||").
class TkDoublePipe < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que fueron encontradas las barras verticales.
  # <i>column</i>:: Columna en la que fueron encontradas las barras 
  # verticales.
  def initialize(line, column)
    super(line, column)
    @name  = "TkDoublePipe"
    @value = "||"
  end
end

# Token signo de exclamación ("!").
class TkBang < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo de exclamación.
  # <i>column</i>:: Columna en la que se encuentra el signo de exclamación.
  def initialize(line, column)
    super(line, column)
    @name  = "TkBang"
    @value = "!"
  end
end

# Token signo de asignación (":=").
class TkAssign < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra el signo de asignación.
  # <i>column</i>:: Columna en la que se encuentra el signo de asignación.
  def initialize(line, column)
    super(line, column)
    @name  = "TkAssign"
    @value = ":="
  end
end

#--
# Tokens denotados por palabras.
#++

# Token "num".
class TkWNum < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "num".
  # <i>column</i>:: Columna en la que se encuentra la palabra "num".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWNum"
    @value = "num"
  end
end

# Token "vec".
class TkWVec < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "vec".
  # <i>column</i>:: Columna en la que se encuentra la palabra "vec".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWVec"
    @value = "vec"
  end
end

# Token "mat".
class TkWMat < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "mat".
  # <i>column</i>:: Columna en la que se encuentra la palabra "mat".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWMat"
    @value = "mat"
  end
end

# Token "vars".
class TkWVars < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "vars".
  # <i>column</i>:: Columna en la que se encuentra la palabra "vars".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWVars"
    @value = "vars"
  end
end

# Token "zeroes".
class TkWZeroes < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "zeroes".
  # <i>column</i>:: Columna en la que se encuentra la palabra "zeroes".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWZeroes"
    @value = "zeroes"
  end
end

# Token "range".
class TkWRange < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "range".
  # <i>column</i>:: Columna en la que se encuentra la palabra "range".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWRange"
    @value = "range"
  end
end

# Token "eye".
class TkWEye < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "eye".
  # <i>column</i>:: Columna en la que se encuentra la palabra "eye".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWEye"
    @value = "eye"
  end
end

# Token "define".
class TkWDefine < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "define".
  # <i>column</i>:: Columna en la que se encuentra la palabra "define".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWDefine"
    @value = "define"
  end
end

# Token "of".
class TkWOf < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "of".
  # <i>column</i>:: Columna en la que se encuentra la palabra "of".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWOf"
    @value = "of"
  end
end

# Token "name".
class TkWType < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "name".
  # <i>column</i>:: Columna en la que se encuentra la palabra "name".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWType"
    @value = "name"
  end
end

# Token "as".
class TkWAs < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "as".
  # <i>column</i>:: Columna en la que se encuentra la palabra "as".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWAs"
    @value = "as"
  end
end

# Token "return".
class TkWReturn < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "return".
  # <i>column</i>:: Columna en la que se encuentra la palabra "return".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWReturn"
    @value = "return"
  end
end

# Token "begin".
class TkWBegin < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "begin".
  # <i>column</i>:: Columna en la que se encuentra la palabra "begin".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWBegin"
    @value = "begin"
  end
end

# Token "end".
class TkWEnd < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "end".
  # <i>column</i>:: Columna en la que se encuentra la palabra "end".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWEnd"
    @value = "end"
  end
end

# Token "if".
class TkWIf < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "if".
  # <i>column</i>:: Columna en la que se encuentra la palabra "if".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWIf"
    @value = "if"
  end
end

# Token "then".
class TkWThen < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "then".
  # <i>column</i>:: Columna en la que se encuentra la palabra "then".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWThen"
    @value = "then"
  end
end

# Token "else".
class TkWElse < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "else".
  # <i>column</i>:: Columna en la que se encuentra la palabra "else".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWElse"
    @value = "else"
  end
end

# Token "while".
class TkWWhile < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "while".
  # <i>column</i>:: Columna en la que se encuentra la palabra "while".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWWhile"
    @value = "while"
  end
end

# Token "do".
class TkWDo < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "do".
  # <i>column</i>:: Columna en la que se encuentra la palabra "do".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWDo"
    @value = "do"
  end
end

# Token "foreach".
class TkWForEach < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "foreach".
  # <i>column</i>:: Columna en la que se encuentra la palabra "foreach".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWForEach"
    @value = "foreach"
  end
end

# Token "in".
class TkWIn < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "in".
  # <i>column</i>:: Columna en la que se encuentra la palabra "in".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWIn"
    @value = "in"
  end
end

# Token "read".
class TkWRead < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "read".
  # <i>column</i>:: Columna en la que se encuentra la palabra "read".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWRead"
    @value = "read"
  end
end

# Token "write".
class TkWWrite < Token
  # Inicializador de la subclase.
  # <i>line</i>:: Línea en la que se encuentra la palabra "write".
  # <i>column</i>:: Columna en la que se encuentra la palabra "write".
  def initialize(line, column)
    super(line, column)
    @name  = "TkWWrite"
    @value = "write"
  end
end
